package com.nowcoder.topic.dp.middle;

/**
 * NC152 数的划分
 * @author d3y1
 */
public class NC152{
    private final int MOD = 1000000007;

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param n int整型 被划分的数
     * @param k int整型 化成k份
     * @return int整型
     */
    public int divideNumber (int n, int k) {
        return solution(n, k);
    }

    /**
     * 动态规划
     *
     * dp[i][j]表示将整数i分成j份的方案数
     *
     * i<j时
     * dp[i][j] = 0
     *
     * i=j时
     * dp[i][j] = 1
     *
     * i>j时:
     * 2种分法
     * (1) 先把第1份置为1(保证该种分法至少有一份为1), 剩下i-1分到其余j-1份中, 有dp[i-1][j-1]种方案
     * (2) 先把所有j份置1(保证该种分法所有份至少为2), 剩下i-j分到j份中, 有dp[i-j][j]种方案
     *
     * 可见递推式:
     *
     *            { 0                          , i<j
     * dp[i][j] = { 1                          , i=j
     *            { dp[i-1][j-1] + dp[i-j][j]  , i>j
     *
     * @param n
     * @param k
     * @return
     */
    private int solution(int n, int k){
        int[][] dp = new int[n+1][k+1];
        dp[0][0] = 1;
        for(int i=1; i<=n; i++){
            for(int j=1; j<=k; j++){
                if(i >= j){
                    dp[i][j] = (dp[i-1][j-1] + dp[i-j][j]) % MOD;
                }
            }
        }

        return dp[n][k];
    }
}